package com.hcryan.djm.utils.page;

import com.github.pagehelper.Page;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.BeanUtils;

import java.util.ArrayList;
import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;

/**
 * @author ryanwdj
 * @since 2025/5/5
 */
public class PageInfoUtil {

    private PageInfoUtil() {
    }

    /**
     * @param list     想要转换为PageInfo对象的list
     * @param pageNum  页码
     * @param pageSize 页容量
     * @return PageInfo 对象
     * @throws
     * @description: 获取自定义分页对象
     */
    public static <T> PageInfo<T> getPageInfo(List<T> list, Integer pageNum, Integer pageSize) {
        PageInfo<T> pageInfo = new PageInfo<>();

        // 设置总记录数
        pageInfo.setTotal(list.size());
        // 设置页容量
        pageInfo.setPageSize(pageSize);
        // 设置当前页码
        pageInfo.setPageNum(pageNum);
        // 设置当前页的数据列表
        pageInfo.setList((pageNum - 1) * pageSize >= list.size() ?
                new ArrayList<>() : list.subList((pageNum - 1) * pageSize, Math.min(pageNum * pageSize, list.size())));

        // 计算并设置总页数
        int totalPages = (int) Math.ceil((double) list.size() / pageSize);
        pageInfo.setPages(totalPages);

        return pageInfo;
    }


    /**
     * convertPageInfo 转换 PageInfo 泛型类型
     *
     * @param sourcePageInfo 原始的 pageInfo 对象
     * @param targetClazz    需要转换的 PageInfo 泛型类型
     * @param <T>            原始类型
     * @param <R>            目标类型
     * @return 转换之后的 PageInfo 对象
     */
    public static <T, R> PageInfo<R> convert(PageInfo<T> sourcePageInfo, Class<R> targetClazz) {
        Page<R> page = new Page<>(sourcePageInfo.getPageNum(), sourcePageInfo.getPageSize());
        page.setTotal(sourcePageInfo.getTotal());

        PageInfo<R> targetPageInfo = new PageInfo<>(page);
        List<R> targetList = sourcePageInfo.getList().stream().map(e -> {
            try {
                R r = targetClazz.getDeclaredConstructor().newInstance();
                BeanUtils.copyProperties(e, r);
                return r;
            } catch (Exception exception) {
                throw new RuntimeException("convertPageInfo cause exception", exception);
            }
        }).collect(Collectors.toList());
        targetPageInfo.setList(targetList);
        return targetPageInfo;
    }

    public static <T, R> PageInfo<R> convert(PageInfo<T> sourcePageInfo, Class<R> targetClazz, Function<T, R> convertFunction) {
        // 创建目标分页信息的 Page 对象
        Page<R> page = new Page<>(sourcePageInfo.getPageNum(), sourcePageInfo.getPageSize());
        page.setTotal(sourcePageInfo.getTotal());

        // 创建 PageInfo<R> 并设置分页属性
        PageInfo<R> targetPageInfo = new PageInfo<>(page);

        // 使用自定义的转换函数来转换 List<T> 到 List<R>
        // 使用转换函数，将每个 T 类型的对象转换成 R 类型
        List<R> targetList = sourcePageInfo.getList().stream().map(convertFunction::apply).collect(Collectors.toList());

        // 设置转换后的数据列表到目标分页对象
        targetPageInfo.setList(targetList);

        return targetPageInfo;
    }

}
